package com.example.routeplansystem.handler;

import com.alibaba.excel.util.BooleanUtils;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.AbstractCellStyleStrategy;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;

/**
 * 这个拦截器用来设置导出结果的Excel表不同路线颜色
 *
 * @author 唐海军
 * @create 2022-07-15 10:23
 */

public class StyleExcelHandler extends AbstractCellStyleStrategy implements CellWriteHandler {

    //用来判断单元格应该为什么颜色
    private static boolean flag;
    private static String v;


    public StyleExcelHandler(){

    }


    @Override
    public void afterCellDispose(CellWriteHandlerContext context) {
        Cell cell = context.getCell();
        int rowIndex = cell.getRowIndex();
        int cellColumnIndex = cell.getColumnIndex();
        if(rowIndex!=0&&cellColumnIndex==0&&!cell.getStringCellValue().equals(v)){
            v=cell.getStringCellValue();
            flag=!flag;
        }

        // 自定义样式处理
        // 当前事件会在 数据设置到poi的cell里面才会回调
        // 判断不是头的情况 如果是fill 的情况 这里会==null 所以用not true
        if (BooleanUtils.isNotTrue(context.getHead())) {
            // 拿到poi的workbook
            Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
            // 这里千万记住 想办法能复用的地方把他缓存起来 一个表格最多创建6W个样式
            // 不同单元格尽量传同一个 cellStyle
            CellStyle cellStyle = workbook.createCellStyle();


            //间隔每条路线点的个数，变一次颜色，注意要去掉表头的影响，所以rowIndex-1
            if (flag) {


                // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND
                cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                //将这个单元格设置为灰色,下面两条语句都行
                cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
                //cellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.GREY_40_PERCENT.getIndex());

            }
            //设置单元格向左对齐
            cellStyle.setAlignment(HorizontalAlignment.LEFT);

            //设置边框，实线
            cellStyle.setBorderLeft(BorderStyle.THIN);
            cellStyle.setBorderRight(BorderStyle.THIN);
            cellStyle.setBorderTop(BorderStyle.THIN);
            cellStyle.setBorderBottom(BorderStyle.THIN);


            cell.setCellStyle(cellStyle);
            // 由于这里没有指定dataformat 最后展示的数据 格式可能会不太正确
            // 这里要把 WriteCellData的样式清空， 不然后面还有一个拦截器 FillStyleCellWriteHandler 默认会将 WriteCellStyle 设置到
            // cell里面去 会导致自己设置的不一样（很关键）
            context.getFirstCellData().setWriteCellStyle(null);
        }
    }

}

